using System;
using System.Collections.Generic;
using TestClassesForConcepts;
using TestClassesForConcepts.Sample3;

concept C1[T] 
{
    using AT1 = Sample1.A<Sample1.MyS, T>;
    //require A == A;
    //require A == B;
    //require AT1 == Sample1.C<Sample1.KeyA>;
}

concept C2[T, S, U, V] 
{
    type A1;
    using _C_T = Sample1.C<T>;
    require Sample1.B<A1, _C_T> <: Sample1.B<A1, S>;
    type B1;
    type B2;
    require Sample1.C<V> <: Sample1.A<B1, B2>;
}

concept C3[S, T, U]
{
    type A1;
    type A2;
    require SF1<SC1<A1>, A2> <: SD1<T, U>;
    require SF1<S, S> <: SA;
    //require SF1<S, S> <: KeyP;

    //require KeyS <: KeyS1;
    //require KeyS <: KeyP;
}

concept C4[T, S, U] 
{
    type A1;
    type A2;
    
    //require SC1<A1> <: SA;
    require SG1<A2> <: SC1<S>;  
    //require A1 == SC1<A1>;
    
    //require SF2 <: SD2<KeyQ, KeyQ>; 
    //require SF2 <: SC1<U>;
    //require SF1<U, S> <: SC1<U>;
    
    //require SF1<U, S> <: SE1<S, U>;
    require SF1<KeyS, KeyQ> <: SE1<KeyS, KeyQ>;
    
    //require SG1<U> <: SF1<S, U>;
    require SG1<U> <: SF1<U, S>;
}